﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace UtilidadesDom.Exceptions
{
    public class PersistenciaException : ApplicationException
    {
        public string Fuente { get; set; }
        public TipoPersistenciaException Tipo { get; set; }
        public string[] ParametrosMetodo { get; set; }

        /// <summary>
        /// Construye una excepción de persistencia a partir de un tipo, una fuente, los parámetros del método y la excepción innerente.
        /// Se encarga de guardar el log en el sistema
        /// </summary>
        /// <param name="tipo">Tipo de la excepción</param>
        /// <param name="fuente">Namespace y clase fuente</param>
        /// <param name="parametrosMetodo">Arreglo de parámetros que recició el método fuente, cad auno de la forma "nombre=valor"</param>
        /// <param name="innerException">Exceppcion innerente</param>
        public PersistenciaException(TipoPersistenciaException tipo, string fuente, string[] parametrosMetodo, Exception innerException)
            : base(darMensaje(tipo), innerException)
        {
            Tipo = tipo;
            Fuente = fuente;
            ParametrosMetodo = parametrosMetodo;
            ErrorUtil.GuardarError(fuente, parametrosMetodo, this);
        }

        /// <summary>
        /// Construye una excepción de persistencia a partir de un tipo, una fuente,  y la excepción innerente.
        /// Se encarga de guardar el log en el sistema
        /// </summary>
        /// <param name="tipo">Tipo de la excepción</param>
        /// <param name="fuente">Namespace y clase fuente</param>
        /// <param name="innerException">Exceppcion innerente</param>
        public PersistenciaException(TipoPersistenciaException tipo, string fuente, Exception innerException)
            : base(darMensaje(tipo), innerException)
        {
            Tipo = tipo;
            Fuente = fuente;
            ErrorUtil.GuardarError(fuente, this);
        }

        private static string darMensaje(TipoPersistenciaException tipo)
        {
            switch (tipo)
            {
                case TipoPersistenciaException.Consulta:
                    return "Ocurrió un error inesperado al consultar los datos, intente de nuevo";
                case TipoPersistenciaException.Actualizacion:
                    return "Ocurrió un error inesperado al modificar los datos, intente de nuevo";
                case TipoPersistenciaException.Insercion:
                    return "Ocurrió un error inesperado al insertar los datos, intente de nuevo";
                default:
                    return "Ocurrió un error, intente de nuevo";
            }
        }
    }

    public enum TipoPersistenciaException
    {
        Consulta = 1,
        Actualizacion = 2,
        Insercion = 3,
        Eliminacion = 4
    }
}
